﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.Net.Mail;
using System.Net.Sockets;
using System.IO;
using System.Text.RegularExpressions;

namespace QLHocSinh
{
    public partial class frmGuiMail : Form
    {
        public frmGuiMail()
        {
            InitializeComponent();
        }

        //Ham kiem tra ket noi mang
        public static bool HasConnection()
        {
            try
            {
                System.Net.IPHostEntry i = System.Net.Dns.GetHostEntry("www.google.com");
                return true;
            }
            catch
            {
                return false;
            }
        }

        public static bool isValidEmail(string inputEmail)
        {
            string strRegex = @"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}" +
                  @"\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\" +
                  @".)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
            Regex re = new Regex(strRegex);
            if (re.IsMatch(inputEmail))
                return true;
            else
                return false;
        }

       
        
        private void btn_guimail_Click(object sender, EventArgs e)
        {
            try
            {
                if (flag == true)
                {
                    MessageBox.Show("Dung lượng file cần gửi vượt quá giới hạn cho phép !.", "Thông báo");
                    return;
                }

                if (!HasConnection())
                {
                    MessageBox.Show("Máy tính của bạn chưa được kết nối Internet. Bạn vui lòng kiểm tra và thực hiện lại", "Thông báo");
                }

                if (!isValidEmail(txt_form.Text))
                {
                    MessageBox.Show("Email không hợp lệ. Bạn vui lòng kiểm tra lại.", "Thông báo");
                    txt_form.Focus();
                    return;
                }

                if (!testData())
                {
                    return;
                }
                
                Cursor.Current = Cursors.WaitCursor;
                GuiMail();
                MessageBox.Show("Mail của bạn đã được gửi đi thành công !");
                Cursor.Current = Cursors.Default;
            }
            catch
            {
                MessageBox.Show("Bạn phải đăng nhập trước khi gửi mail");
            }
        }

        private bool testData()
        {
            if (txt_form.Text == "")
            {
                MessageBox.Show("Bạn phải nhập mail của người gửi.", "Thông báo");
                txt_form.Focus();
                return false;
            }
            if (txt_mk.Text == "")
            {
                MessageBox.Show("Bạn phải nhập mật khẩu để đăng nhập vào mail.", "Thông báo");
                txt_mk.Focus();
                return false;
            }
            if (txt_form.Text == "")
            {
                MessageBox.Show("Bạn phải nhập mail của người gửi.", "Thông báo");
                txt_form.Focus();
                return false;
            }
            DialogResult thongbao = new DialogResult();
            if (txt_subject.Text == "")
            {
                thongbao = MessageBox.Show("Mail của bạn chưa có tiêu đề. Bạn có muốn tiếp tục gửi không ?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (thongbao == DialogResult.No)
                {
                    txt_subject.Focus();
                    return false;
                }
                
            }
            if (txt_body.Text == "")
            {
                MessageBox.Show("Bạn phải nhập nội dung mail.", "Thông báo");
                txt_body.Focus();
                return false;

            }
            return true;
        }

        private void GuiMail()
        {
            MailAddress emailfrom = new MailAddress(txt_form.Text);
            //----- Mail object
            MailMessage mm = new MailMessage();
            mm.Body = txt_body.Text;
            mm.From = emailfrom;
            mm.Sender = emailfrom;
            mm.Subject = txt_subject.Text;
            if (txt_path.Text != "")
            {
                Attachment attach = new Attachment(txt_path.Text);
                mm.Attachments.Add(attach);
            }
            SmtpClient smtp = new SmtpClient();
            if (txt_form.Text.IndexOf("yahoo") >= 0)
            {
                smtp.Host = "smtp.mail.yahoo.com";
                smtp.Port = 465;
                MessageBox.Show("Bạn phải gửi từ địa chỉ Email của gmail !");
                return;
            }
            else
            {
                smtp.Host = "smtp.gmail.com";
                smtp.Port = 587;
            }

            smtp.EnableSsl = true;
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            //----- Credentials
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = new NetworkCredential(txt_form.Text, txt_mk.Text);
            string chuoigoc = txt_to.Text;
            string[] ketqua = chuoigoc.Split(';');

            for (int j = 0; j < ketqua.Length; j++)
            {
                if (!isValidEmail(ketqua[j]))
                {
                    MessageBox.Show("Email không hợp lệ. Bạn vui lòng kiểm tra lại.", "Thông báo");
                    txt_to.Focus();
                    return;
                }
                mm.To.Add(ketqua[j]);
                StringBuilder sberror = new StringBuilder();
                try
                {
                    smtp.Send(mm);
                }
                catch (SmtpFailedRecipientsException ex)
                {
                    for (int i = 0; i < ex.InnerExceptions.Length; i++)
                    {
                        SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
                        if (status == SmtpStatusCode.MailboxBusy || status == SmtpStatusCode.MailboxUnavailable)
                        {
                            sberror.Append("Không tìm thấy mail đến !");
                        }
                        else
                        {
                            sberror.Append("Gửi thất bại " + ex.InnerExceptions[i].FailedRecipient);
                        }
                    }
                }
                catch (SmtpException ex)
                {
                    sberror.Append(ex.Message);
                }
            }


        }

        private void btn_trove_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btn_lammoi_Click(object sender, EventArgs e)
        {
            txt_to.Text = "";
            txt_subject.Text = "";
            txt_body.Text = "";
            txt_path.Text = "";
        }
        //Lay emil tu csdl
        private void button1_Click(object sender, EventArgs e)
        {

        }

        private void frmGuiMail_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (this.ActiveControl.Name != "gridControl")
                {
                    this.SelectNextControl(this.ActiveControl, true, true, true, false);
                }
            }
           
            else if (e.KeyCode == Keys.Escape)
            {
                btn_trove_Click(sender, null);
            }
        }

        private void frmGuiMail_Load(object sender, EventArgs e)
        {

        }

        private bool flag = false;
        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialogImage = new OpenFileDialog();
            openFileDialogImage.Filter = "All files (*.*)|*.*";
            //thiết lặp đường dẫn mặc định, và có khả năng nhớ đường dẫn
            openFileDialogImage.InitialDirectory = (Application.ExecutablePath);
            openFileDialogImage.Title = "Chọn file";
            if (openFileDialogImage.ShowDialog() == DialogResult.OK)
            {
                txt_path.Text = openFileDialogImage.FileName;
                FileInfo fileInfo = new FileInfo(txt_path.Text);
                long totalSize = 0;
                totalSize = fileInfo.Length;
                long MaxSize = 26214400; //= 25MB
                if (totalSize >= MaxSize)
                {
                    flag = true;
                    MessageBox.Show("Dung lượng file cần gửi vượt quá giới hạn cho phép !.", "Thông báo");
                    button2.Focus();
                }
                else
                {
                    flag = false;
                }
            }
        }
    }
}
